﻿using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.ApplicationModel.Search;
using Windows.UI.ApplicationSettings;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using XnReader.WinRT.Common;
using XnReader.WinRT.Forms;

// “空白应用程序”模板在 http://go.microsoft.com/fwlink/?LinkId=234227 上有介绍

namespace XnReader.WinRT
{
    /// <summary>
    /// 提供特定于应用程序的行为，以补充默认的应用程序类。
    /// </summary>
    sealed partial class App : Application
    {
        /// <summary>
        /// 初始化单一实例应用程序对象。这是执行的创作代码的第一行，
        /// 逻辑上等同于 main() 或 WinMain()。
        /// </summary>
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }

        /// <summary>
        /// 在应用程序由最终用户正常启动时进行调用。
        /// 当启动应用程序以执行打开特定的文件或显示搜索结果等操作时
        /// 将使用其他入口点。
        /// </summary>
        /// <param name="args">有关启动请求和过程的详细信息。</param>
        protected async override void OnLaunched(LaunchActivatedEventArgs args)
        {
            Frame rootFrame = Window.Current.Content as Frame;

            // 不要在窗口已包含内容时重复应用程序初始化，
            // 只需确保窗口处于活动状态
            if (rootFrame == null)
            {
                // 创建要充当导航上下文的框架，并导航到第一页
                rootFrame = new Frame();
                SuspensionManager.RegisterFrame(rootFrame, "XnReader");
                if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    //TODO: 从之前挂起的应用程序加载状态
                    await SuspensionManager.RestoreAsync();
                }

                // 将框架放在当前窗口中
                Window.Current.Content = rootFrame;
            }

            if (rootFrame.Content == null)
            {
                // 当未还原导航堆栈时，导航到第一页，
                // 并通过将所需信息作为导航参数传入来配置
                // 参数
                if (!rootFrame.Navigate(typeof(BookcaseDx), args.Arguments))
                {
                    throw new Exception("Failed to create initial page");
                }
            }
            // 确保当前窗口处于活动状态
            Window.Current.Activate();
        }

        /// <summary>
        /// 在将要挂起应用程序执行时调用。在不知道应用程序
        /// 将被终止还是恢复的情况下保存应用程序状态，
        /// 并让内存内容保持不变。
        /// </summary>
        /// <param name="sender">挂起的请求的源。</param>
        /// <param name="e">有关挂起的请求的详细信息。</param>
        private async void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            //TODO: 保存应用程序状态并停止任何后台活动
            await SuspensionManager.SaveAsync();
            deferral.Complete();
        }

        /// <summary>
        /// 在激活应用程序以显示搜索结果时调用。
        /// </summary>
        /// <param name="args">有关激活请求的详细信息。</param>
        protected async override void OnSearchActivated(SearchActivatedEventArgs args)
        {
            // TODO: 在 OnWindowCreated 中注册 Windows.ApplicationModel.Search.SearchPane.GetForCurrentView().QuerySubmitted
            // 事件，以在应用程序运行后加快搜索

            // 如果窗口尚未使用框架导航，则插入我们自己的框架
            var previousContent = Window.Current.Content;
            var frame = previousContent as Frame;

            // 如果应用程序不包含顶级框架，则可能表示这是
            // 初次启动应用程序。一般而言，此方法和 App.xaml.cs 中的 OnLaunched 
            // 可调用公共方法。
            if (frame == null)
            {
                // 创建要充当导航上下文的框架，并将其与
                // SuspensionManager 键关联
                frame = new Frame();
                SuspensionManager.RegisterFrame(frame, "AppFrame");

                if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    // 仅当适用时还原保存的会话状态
                    try
                    {
                        await SuspensionManager.RestoreAsync();
                    }
                    catch (SuspensionManagerException)
                    {
                        //还原状态时出现问题。
                        //假定没有状态并继续
                    }
                }
            }

            frame.Navigate(typeof (OnlineArticleList), string.Format("search{0}", args.QueryText));
            Window.Current.Content = frame;

            // 确保当前窗口处于活动状态
            Window.Current.Activate();
        }

        #region Navigate Search

        private void OnQuerySubmitted(object sender, SearchPaneQuerySubmittedEventArgs args)
        {
            if (!string.IsNullOrEmpty(args.QueryText))
            {
                var rootFrame = Window.Current.Content as Frame;
                if (rootFrame != null) rootFrame.Navigate(typeof(OnlineArticleList), string.Format("search{0}",args.QueryText));
            }
        }

        protected override void OnWindowCreated(WindowCreatedEventArgs args)
        {
            SearchPane.GetForCurrentView().QuerySubmitted += OnQuerySubmitted;
            SettingsPane.GetForCurrentView().CommandsRequested += onCommandsRequested;
        }

        #endregion

        //protected override void OnWindowCreated(WindowCreatedEventArgs args)
        //{
        //    SettingsPane.GetForCurrentView().CommandsRequested += onCommandsRequested;

        //    base.OnWindowCreated(args);
        //}

        void onCommandsRequested(SettingsPane settingsPane, SettingsPaneCommandsRequestedEventArgs eventArgs)
        {

            //表示处理在用户调用上下文菜单命令时引发的事件的回调函数。
            UICommandInvokedHandler handler = new UICommandInvokedHandler(onSettingsCommand);

            //创建表示设置项的设置命令对象。此设置命令可追加到 ApplicationCommands 矢量。
            SettingsCommand privacyStatement = new SettingsCommand("privacyStatement", "隐私政策", handler);

            //追加 SettingsCommand 对象，使这些对象可供 SettingsPane UI 使用。
            eventArgs.Request.ApplicationCommands.Add(privacyStatement);

        }


        //当命令调用时
        async void onSettingsCommand(IUICommand command)
        {
            SettingsCommand settingsCommand = (SettingsCommand)command;

            if (settingsCommand.Id.ToString() == "privacyStatement")
            {
                Uri pageUri = new Uri("http://xsll.bitpx.com/privacy.html");
                await Windows.System.Launcher.LaunchUriAsync(pageUri);
            }
        }
    }
}
